home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / pascal / MEMORY.SWG / 0004_Overlays in XMS.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1996-02-21  |  10.3 KB  |  388 lines

  1. {
  2. Dv> CC> i know there is a way to load overlays into ems, but how do you
  3. Dv> CC> load 'em  into xms?
  4.  
  5. Dv> As far as I know it isn't possible with the standard overlay
  6. Dv>manager. But if  you get any reactions on this I would certainly love
  7. Dv>to hear about them...
  8.  
  9. Oops, I got this message second-hand...  but there is a file called
  10. OVERXMS.ZIP that will do it.  I'll send it to you (WARNING: it'll come
  11. split up in several shorter messages)
  12.  
  13. [OVERXMS.PAS]
  14.  
  15. { OVERXMS - Loads overlays in XMS.  Written by Wilbert van Leijen }
  16.  
  17. Unit OverXMS;
  18.  
  19. {$O- }
  20.  
  21. Interface
  22. uses Overlay;
  23.  
  24. Const
  25.   ovrNoXMSDriver = -7;                 { No XMS driver installed }
  26.   ovrNoXMSMemory = -8;                 { Insufficient XMS memory 
  27. available }
  28.  
  29. Procedure OvrInitXMS;
  30.  
  31. Implementation
  32.  
  33. Procedure OvrInitXMS; External;
  34. {$L OVERXMS.OBJ }
  35.  
  36. end.  { OverXMS }
  37.  
  38. [OVERXMS.ASM]
  39. TITLE Turbo Pascal XMS support for loading overlays - By Wilbert van Leijen
  40. PAGE 65, 132
  41. LOCALS @@
  42.  
  43. Data       SEGMENT Word Public
  44.            ASSUME  DS:Data
  45.  
  46. ;  XMS block move record
  47.  
  48. XmsMoveType STRUC
  49.            BlkSize     DD    ?
  50.            SrcHandle   DW    ?
  51.            SrcOffset   DD    ?
  52.            DestHandle  DW    ?
  53.            DestOffset  DD    ?
  54. XmsMoveType ENDS
  55.  
  56. ;  TP overlay manager record
  57.  
  58. OvrHeader  STRUC
  59.            ReturnAddr  DD    ?         ; Virtual return address
  60.            FileOfs     DD    ?         ; Offset into overlay file
  61.            CodeSize    DW    ?         ; Size of overlay
  62.            FixupSize   DW    ?         ; Size of fixup table
  63.            EntryPts    DW    ?         ; Number of procedures
  64.            CodeListNext DW   ?         ; Segment of next overlay
  65.            LoadSeg     DW    ?         ; Start segment in memory
  66.            Reprieved   DW    ?         ; Loaded in memory flag
  67.            LoadListNext DW   ?         ; Segment of next in load list
  68.            XmsOffset   DD    ?         ; Offset into allocated XMS block
  69.            UserData    DW    3 DUP(?)
  70. OvrHeader  ENDS
  71.  
  72. XmsDriver  DD      ?                   ; Entry point of XMS driver
  73. ExitSave   DD      ?                   ; Pointer to previous exit proc
  74. XmsMove    XmsMoveType <>
  75. OvrXmsHandle DW    ?                   ; Returned by XMS driver
  76.  
  77.            Extrn   PrefixSeg : Word
  78.            Extrn   ExitProc : DWord
  79.            Extrn   OvrResult : Word
  80.            Extrn   OvrCodeList : Word
  81.            Extrn   OvrDosHandle : Word
  82.            Extrn   OvrHeapOrg : Word
  83.            Extrn   OvrReadBuf : DWord
  84. Data       ENDS
  85.  
  86. Code       SEGMENT Byte Public
  87.            ASSUME  CS:Code
  88.            Public  OvrInitXMS
  89.  
  90. ovrIOError     EQU     -4
  91. ovrNoXMSDriver EQU     -7
  92. ovrNoXMSMemory EQU     -8
  93.  
  94. OvrXmsExit PROC
  95.  
  96. ; Release handle and XMS memory
  97.  
  98.         MOV    DX, [OvrXmsHandle]
  99.         MOV    AH, 10
  100.         CALL   [XmsDriver]
  101.  
  102. ; Restore pointer to previous exit procedure
  103.  
  104.         LES    AX, [ExitSave]
  105.         MOV    Word Ptr [ExitProc], AX
  106.         MOV    Word Ptr [ExitProc+2], ES
  107.         RETF
  108. OvrXmsExit ENDP
  109.  
  110. AllocateXms PROC
  111.  
  112. ;  Determine the size of the XMS block to allocate:
  113. ;  Walk the CodeListNext chain
  114. ;  Store the total codesize in DX:AX
  115.  
  116.         XOR    AX, AX
  117.         XOR    DX, DX
  118.         MOV    BX, [OvrCodeList]
  119. @@1:    ADD    BX, [PrefixSeg]
  120.         ADD    BX, 10h
  121.         MOV    ES, BX
  122.         ADD    AX, ES:[OvrHeader.CodeSize]
  123.         ADC    DX, 0
  124.         MOV    BX, ES:[OvrHeader.CodeListNext]
  125.         OR     BX, BX
  126.         JNZ    @@1
  127.  
  128. ;  Obtain number of kilobytes to allocate
  129.  
  130.         MOV    BX, 1024
  131.         DIV    BX
  132.         XCHG   DX, AX
  133.         INC    DX
  134.  
  135. ;  Allocate the block
  136.  
  137.         MOV    AH, 9
  138.         CALL   [XmsDriver]
  139.         OR     AX, AX
  140.         JZ     @@2
  141.         MOV    [OvrXmsHandle], DX
  142. @@2:    RETN
  143. AllocateXms ENDP
  144.  
  145. ;  Function XmsReadFunc(OvrSeg : Word) : Integer; Far;
  146.  
  147. XmsReadFunc PROC
  148.  
  149. ;  Swap the code from XMS to the heap
  150.  
  151.         PUSH   BP
  152.         MOV    BP, SP
  153.         MOV    ES, [BP+6]
  154.         MOV    AX, ES:[OvrHeader.CodeSize]
  155.         MOV    Word Ptr [XmsMove.BlkSize], AX
  156.         XOR    AX, AX
  157.         MOV    Word Ptr [XmsMove.BlkSize+2], AX
  158.         MOV    AX, [OvrXmsHandle]
  159.         MOV    [XmsMove.SrcHandle], AX
  160.         MOV    AX, Word Ptr ES:[OvrHeader.XmsOffset]
  161.         MOV    Word Ptr [XmsMove.SrcOffset], AX
  162.         MOV    AX, Word Ptr ES:[OvrHeader.XmsOffset+2]
  163.         MOV    Word Ptr [XmsMove.SrcOffset+2], AX
  164.         XOR    AX, AX
  165.         MOV    [XmsMove.DestHandle], AX
  166.         MOV    Word Ptr [XmsMove.DestOffset], AX
  167.         MOV    AX, ES:[OvrHeader.LoadSeg]
  168.         MOV    Word Ptr [XmsMove.DestOffset+2], AX
  169.         MOV    AH, 11
  170.         LEA    SI, XmsMove
  171.         CALL   [XmsDriver]
  172.         OR     AX, AX
  173.         JZ     @@1
  174.         DEC    AX
  175.         JMP    @@2
  176.  
  177. @@1:    MOV    AX, ovrIOError
  178. @@2:    POP    BP
  179.         RETF   2
  180. XmsReadFunc ENDP
  181.  
  182. ;  Copy an overlaid unit from the heap to XMS
  183. ;  If successful, carry flag is cleared
  184. ;  In/Out:
  185. ;    BX:DI = offset into XMS memory block
  186.  
  187. CopyUnitToXms PROC
  188.  
  189. ;  XMS requires that an even number of bytes is moved
  190.  
  191.         MOV    DX, ES:[OvrHeader.CodeSize]
  192.         TEST   DX, 1
  193.         JZ     @@1
  194.         INC    DX
  195.         INC    ES:[OvrHeader.CodeSize]
  196.  
  197. ;  Get the fields of the XMS block move structure
  198.  
  199. @@1:    MOV    Word Ptr [XmsMove.BlkSize], DX
  200.         XOR    AX, AX
  201.         MOV    Word Ptr [XmsMove.BlkSize+2], AX
  202.         MOV    [XmsMove.SrcHandle], AX
  203.         MOV    Word Ptr [XmsMove.SrcOffset], AX
  204.         MOV    AX, [OvrHeapOrg]
  205.         MOV    Word Ptr [XmsMove.SrcOffset+2], AX
  206.         MOV    AX, [OvrXmsHandle]
  207.         MOV    [XmsMove.DestHandle], AX
  208.         MOV    Word Ptr [XmsMove.DestOffset], DI
  209.         MOV    Word Ptr [XmsMove.DestOffset+2], BX
  210.         MOV    AH, 11
  211.         LEA    SI, XmsMove
  212.         CALL   [XmsDriver]
  213.  
  214. ;  Bump code size
  215.  
  216.         ADD    DI, DX
  217.         ADC    BX, 0
  218.  
  219. ;  Check return code from XMS driver
  220.  
  221.         OR     AX, AX
  222.         JZ     @@2
  223.         CLC
  224.         RETN
  225.  
  226. @@2:    STC
  227.         RETN
  228. CopyUnitToXms ENDP
  229.  
  230. OvrXmsLoad PROC
  231.         PUSH   BP
  232.         MOV    BP, SP
  233.  
  234. ;  Walk the CodeList chain
  235. ;  First segment is PrefixSeg+10h+OvrCodeList
  236. ;  Push each element of overlaid unit list on the stack
  237. ;  Keep the size of the linked list in CX
  238.  
  239.         MOV    AX, [OvrCodeList]
  240.         XOR    CX, CX
  241. @@1:    ADD    AX, [PrefixSeg]
  242.         ADD    AX, 10h
  243.         MOV    ES, AX
  244.         PUSH   AX
  245.         INC    CX
  246.         MOV    AX, ES:[OvrHeader.CodeListNext]
  247.         OR     AX, AX
  248.         JNZ    @@1
  249.  
  250. ;  Loop:
  251. ;    Pop each element of the overlaid unit list from the stack
  252.  
  253.         XOR    BX, BX
  254.         XOR    DI, DI
  255. @@2:    POP    ES
  256.         PUSH   CX
  257.         MOV    AX, [OvrHeapOrg]
  258.         MOV    ES:[OvrHeader.LoadSeg], AX
  259.         MOV    Word Ptr ES:[OvrHeader.XmsOffset+2], BX
  260.         MOV    Word Ptr ES:[OvrHeader.XmsOffset], DI
  261.  
  262. ;  Load overlay from disk
  263.  
  264.         PUSH   BX
  265.         PUSH   DI
  266.         PUSH   ES
  267.         PUSH   ES
  268.         CALL   [OvrReadBuf]
  269.         POP    ES
  270.         POP    DI
  271.         POP    BX
  272.  
  273. ;  Flag unit as 'unloaded'; check return code
  274.  
  275.         MOV    ES:[OvrHeader.LoadSeg], 0
  276.         NEG    AX
  277.         JC     @@3
  278.  
  279.         CALL   CopyUnitToXms
  280.         JC     @@3
  281.  
  282.         POP    CX
  283.         LOOP   @@2
  284.  
  285. @@3:    MOV    SP, BP
  286.         POP    BP
  287.         RETN
  288. OvrXMSLoad ENDP
  289.  
  290. OvrInitXMS PROC
  291.  
  292. ;  Make sure the file's been opened
  293.  
  294.         XOR    AX, AX
  295.         CMP    AX, [OvrDOSHandle]
  296.         JNE    @@1
  297.         DEC    AX                      ; ovrError
  298.         JMP    @@5
  299.  
  300. ;  Check presence of XMS driver
  301.  
  302. @@1:    MOV    AX, 4300h
  303.         INT    2Fh
  304.         CMP    AL, 80h
  305.         JE     @@2
  306.         MOV    AX, ovrNoXmsDriver
  307.         JMP    @@5
  308.  
  309. ;  Get XMS driver's entry point
  310.  
  311. @@2:    MOV    AX, 4310h
  312.         INT    2Fh
  313.         MOV    Word Ptr [XmsDriver], BX
  314.         MOV    Word Ptr [XmsDriver+2], ES
  315.         CALL   AllocateXms
  316.         JNZ    @@3
  317.         MOV    AX, ovrNoXMSMemory
  318.         JMP    @@5
  319.  
  320. ;  Load the overlay into XMS
  321.  
  322. @@3:    CALL   OvrXmsLoad
  323.         JNC    @@4
  324.  
  325. ;  An error occurred.  Release handle and XMS memory
  326.  
  327.         MOV    DX, [OvrXmsHandle]
  328.         MOV    AH, 10
  329.         CALL   [XmsDriver]
  330.         MOV    AX, ovrIOError
  331.         JMP    @@5
  332.  
  333. ;  Close file
  334.  
  335. @@4:    MOV    BX, [OvrDOSHandle]
  336.         MOV    AH, 3Eh
  337.         INT    21h
  338.  
  339. ;  OvrReadBuf := XmsReadFunc
  340.  
  341.         MOV    Word Ptr [OvrReadBuf], Offset XmsReadFunc
  342.         MOV    Word Ptr [OvrReadBuf+2], CS
  343.  
  344. ;  ExitSave := ExitProc
  345. ;  ExitProc := OvrXmsExit
  346.  
  347.         LES    AX, [ExitProc]
  348.         MOV    Word Ptr [ExitSave], AX
  349.         MOV    Word Ptr [ExitSave+2], ES
  350.         MOV    Word Ptr [ExitProc], Offset OvrXmsExit
  351.         MOV    Word Ptr [ExitProc+2], CS
  352.  
  353. ;  Return result of initialisation
  354.  
  355.         XOR    AX, AX
  356. @@5:    MOV    [OvrResult], AX
  357.         RETF
  358. OvrInitXMS ENDP
  359.  
  360. Code       ENDS
  361.            END
  362.  
  363. {------------------ XX3402 Code
  364.    Cut out, and use XX3402 to Decode :   Save file as OVERXMS.XX
  365.  
  366.    Execute      XX3402 d overxms.xx
  367.  
  368. *XX3402-000913-210296--72--85-09820-----OVERXMS.OBJ--1-OF--1
  369. U+o+0qxqNL7sPLAiEJBBFMUU++++53FpQa7j623nQqJhMalZQW+UJaJmQqZjPW+n9X8NW-A+
  370. ECb7c3IU0qxqNL7sPLAiEJBBA6U1+21dH7M0++-cW+A+E84IZUM+-2F-J234a+Q+G-c++U2-
  371. ytM4++F1HoF3FNU5+0Wi+EA-+MKAJ++7I373FYZMIoJ5++V3K2ZII37DEk+7HpNGIYJHJIlI
  372. ++hDJZ71HoF3H2ZHJ++AHpNGF2xHG23CF2l3++dDJZ76FI3EHp75++dDJZ7GFI32EZJ4+0OE
  373. 2E+++UdDJZ77HYZIK2pHCE2+xcU2+20W+N4UgU20++093VU+h+fz5U++l+M2+8A++6k4+U19
  374. Aw+nocgS+++15U++UwAEXgAa+kM6+6DG+0O95Us+0xhptfg+-DTnYY8o0TwS+++9k5E2WFMM
  375. +ABJWymCFUMacEU+ckU+Aw0X0U0V4+0X1++acFM+cks+7e2M+8AE+1D+cl6+clE+7e2E+8AK
  376. +9E9jUU+zls+++j+R+F6ukGEiDnzLQc0+0O93UU+xw6-+5E4EWPz-UU+WFM6+1D+ckc+ckk+
  377. cks+cE++cl++cFU+cl6+WHsI+6YS3U0o0vs6+DwS+++1ycDH++j+R+9skzb1JMjgcE++AwY1
  378. -U++-F++Xg-EEGOV1U+9k5LhAxgnzkRFcE++7eAE+0O75VU+7cYy3U-HJkM4zls+++RTKmP5
  379. -V++++1rq566u4jzQUBNsgy9tJr1Aw+v-U++REF6uqOEi+-1nGwwU5E4iDbzupSEi--1nGy7
  380. 5U++X+M0+CWmzbI4iDXzunyEu5PzQl093VU+h+fz5U++iDnzumeEWls++9EynG55-U++HU0A
  381. 1U6+l+M++8A2+6k4-U15-U++++0A1U6+Aw0X++19RdnW+AE0J+5203E-l+lI+QED-U20l-A4
  382. +E925+M--AEU-U2-l2BI+QF9J+52KJE-l3tI+QFVJ+52N3E-l4hI+QFmJ+52RpE-l5dI+QG-
  383. J+52VZE-l6dI+QGiJ+52gpE-l9NI+QGtJ+52j+M--gGzJ+52kZE-lAJI+QH7J+52nJE-lB7I
  384. +QHKJ+52uEM--AHj-U2-lEQ4+EP35EM--wIx-U23lJhI+QJTJ+53QpE-lLZI+QK1-U23lMg4
  385. +ET3XJE0lN24+ET3ZEM-+gKMJ+53b3E-lO+4+E93cZE0lOM4+E93ekM-+z88+U++R+++
  386. ***** END OF BLOCK 1 *****
  387.  
  388.